home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1997 / HAM Radio 1997.iso / vcls / date / tcom / tcommain.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-04-08  |  28.4 KB  |  1,050 lines

  1. {$G+,X+,F+}
  2.  
  3. {Conditional defines that may affect this unit}
  4. {$I AWDEFINE.INC}
  5.  
  6. {*********************************************************}
  7. {*                  TCOMMAIN.PAS 1.01                    *}
  8. {*        Copyright (c) TurboPower Software 1995         *}
  9. {*                 All rights reserved.                  *}
  10. {*********************************************************}
  11.  
  12. unit TcomMain;
  13.   {-Main form for TCOM demonstration}
  14.  
  15. interface
  16.  
  17. uses
  18.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  19.   Forms, Dialogs, Menus, Buttons, ExtCtrls, OoMisc, AdMisc, AdTerm, AdPort,
  20.   AdDial, AdGetNum, AdPBEdit, AdIniDB, AdPBook, AdModem, AdModDB, AdProtcl,
  21.   AdPStat, StdCtrls, TComIni, ComParm, FlowParm, DialParm, DirParm, TComMod,
  22.   QModem, AdStatLt, BatchUL, GenProt, ZMOpt, BPOpt, AscOpt, Kermopt, ProtSel,
  23.   DownDir, TCSelCom, DevSel, AdExcept, AdxBP;
  24.  
  25. type
  26.   TMainForm = class(TForm)
  27.     MainMenu: TMainMenu;
  28.     FilesMenu: TMenuItem;
  29.     UploadItem: TMenuItem;
  30.     DownloadItem: TMenuItem;
  31.     CaptureItem: TMenuItem;
  32.     N1: TMenuItem;
  33.     ExitItem: TMenuItem;
  34.     PreferencesMenu: TMenuItem;
  35.     ModemMenu: TMenuItem;
  36.     PhonebookItem: TMenuItem;
  37.     DialItem: TMenuItem;
  38.     HangupItem: TMenuItem;
  39.     TerminalFontItem: TMenuItem;
  40.     ParametersItem: TMenuItem;
  41.     FlowControlItem: TMenuItem;
  42.     DeviceItem: TMenuItem;
  43.     DialerItem: TMenuItem;
  44.     DirectoriesItem: TMenuItem;
  45.     ModemItem: TMenuItem;
  46.     ModemConfigItem: TMenuItem;
  47.     ProtocolsMenu: TMenuItem;
  48.     GeneralItem: TMenuItem;
  49.     ZmodemItem: TMenuItem;
  50.     KermitItem: TMenuItem;
  51.     ASCIIItem: TMenuItem;
  52.     BPlusItem: TMenuItem;
  53.     Toolbar: TPanel;
  54.     DialBtn: TSpeedButton;
  55.     HangupBtn: TSpeedButton;
  56.     UploadBtn: TSpeedButton;
  57.     DownloadBtn: TSpeedButton;
  58.     CaptureBtn: TSpeedButton;
  59.     ParametersBtn: TSpeedButton;
  60.     PhonebookBtn: TSpeedButton;
  61.     FontBtn: TSpeedButton;
  62.     StatusLine: THeader;
  63.     ComPort: TApdComPort;
  64.     Emulator: TApdEmulator;
  65.     ModemDatabase: TApdModemDBase;
  66.     Modem: TApdModem;
  67.     Phonebook: TApdPhonebook;
  68.     PhonebookEditor: TApdPhonebookEditor;
  69.     PhoneNumberSelector: TApdPhoneNumberSelector;
  70.     Protocol: TApdProtocol;
  71.     ProtocolLog: TApdProtocolLog;
  72.     ProtocolStatus: TApdProtocolStatus;
  73.     UploadSelDialog: TOpenDialog;
  74.     SaveDialog: TSaveDialog;
  75.     FontDialog: TFontDialog;
  76.     LightPanel: TPanel;
  77.     StatusLights: TApdSLController;
  78.     CTSLight: TApdStatusLight;
  79.     DSRLight: TApdStatusLight;
  80.     DCDLight: TApdStatusLight;
  81.     RILight: TApdStatusLight;
  82.     TXDLight: TApdStatusLight;
  83.     RXDLight: TApdStatusLight;
  84.     ErrLight: TApdStatusLight;
  85.     BrkLight: TApdStatusLight;
  86.     Label1: TLabel;
  87.     Label2: TLabel;
  88.     Label3: TLabel;
  89.     Label4: TLabel;
  90.     Label5: TLabel;
  91.     Label6: TLabel;
  92.     Label7: TLabel;
  93.     Label8: TLabel;
  94.     HiddenStuffItem: TMenuItem;
  95.     ScrollbackItem: TMenuItem;
  96.     MainTerminal: TApdBPTerminal;
  97.     DialerDialog: TApdDialerDialog;
  98.     procedure FormCreate(Sender: TObject);
  99.     procedure UploadItemClick(Sender: TObject);
  100.     procedure DownloadItemClick(Sender: TObject);
  101.     procedure CaptureItemClick(Sender: TObject);
  102.     procedure ExitItemClick(Sender: TObject);
  103.     procedure TerminalFontItemClick(Sender: TObject);
  104.     procedure ParametersItemClick(Sender: TObject);
  105.     procedure FlowControlItemClick(Sender: TObject);
  106.     procedure DeviceItemClick(Sender: TObject);
  107.     procedure DialerItemClick(Sender: TObject);
  108.     procedure DirectoriesItemClick(Sender: TObject);
  109.     procedure ModemItemClick(Sender: TObject);
  110.     procedure ModemConfigItemClick(Sender: TObject);
  111.     procedure GeneralItemClick(Sender: TObject);
  112.     procedure ZmodemItemClick(Sender: TObject);
  113.     procedure KermitItemClick(Sender: TObject);
  114.     procedure ASCIIItemClick(Sender: TObject);
  115.     procedure BPlusItemClick(Sender: TObject);
  116.     procedure PhonebookItemClick(Sender: TObject);
  117.     procedure DialItemClick(Sender: TObject);
  118.     procedure HangupItemClick(Sender: TObject);
  119.     procedure DialBtnClick(Sender: TObject);
  120.     procedure HangupBtnClick(Sender: TObject);
  121.     procedure UploadBtnClick(Sender: TObject);
  122.     procedure DownloadBtnClick(Sender: TObject);
  123.     procedure CaptureBtnClick(Sender: TObject);
  124.     procedure ParametersBtnClick(Sender: TObject);
  125.     procedure PhonebookBtnClick(Sender: TObject);
  126.     procedure FontBtnClick(Sender: TObject);
  127.     procedure ModemOk(Sender: TObject);
  128.     procedure ModemError(Sender: TObject);
  129.     procedure ProtocolFinish(CP: TObject; ErrorCode: Integer);
  130.     procedure MainTerminalKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  131.     procedure ScrollbackToggleItemClick(Sender: TObject);
  132.     procedure ZmodemTrigger(CP: TObject; TriggerHandle: Word);
  133.     procedure TerminalStatus(CP: TObject; Row, Col: Byte; BufRow, BufCol: Word);
  134.     procedure BPlusStart(Sender: TObject);
  135.     procedure BPlusResume(CP: TObject; var Resume: TWriteFailAction);
  136.     procedure ProtocolNextFile(CP: TObject; var FName: OpenString);
  137.     (*{!!.01 - added}
  138.     procedure EmulationItemClick(Sender: TObject);
  139.     {!!.01 - added}
  140.     procedure EmulationBtnClick(Sender: TObject);*)
  141.     procedure SpeedButton1Click(Sender: TObject);
  142.  
  143.   private
  144.     Initializing  : Boolean;     {TRUE if we're initializing the modem}
  145.     UploadIdx     : Integer;     {number of file to upload next}
  146.     UploadList    : TStringList; {list of files to upload}
  147.     AutoTrig      : Word;        {Trigger for zmodem auto start}
  148.  
  149.     SavedParity   : TParity;
  150.     SavedDataBits : Word;
  151.     SavedStopBits : Word;
  152.  
  153.     procedure OpenComPort;
  154.       {-Open the communications port}
  155.     procedure SetDialerOptions;
  156.       {-Set the dialer component properties based on configuration data}
  157.     procedure SizeToFont;
  158.       {-Size the terminal to the current font size}
  159.     procedure EnableZmodemAutoStart;
  160.       {-Add zmodem auto start trigger}
  161.     procedure DoUpload(Prot : TProtocolType);
  162.       {-Upload file(s)}
  163.     procedure DoDownload(Prot : TProtocolType);
  164.       {-Download file(s)}
  165.     procedure ChangeLineSettingsForProtocol;
  166.       {-Save the current line settings before protocol}
  167.     procedure RestoreLineSettings;
  168.       {-Restore line settings to originals}
  169.   end;
  170.  
  171. var
  172.   MainForm: TMainForm;
  173.  
  174. const
  175.   BatchProtocols = [ptYmodem, ptYmodemG, ptZmodem, ptKermit];
  176.   AutoStartSt    = 'rz'#13;
  177.  
  178. implementation
  179.  
  180. function YesNo(const Question : String) : Boolean;
  181.   {-Ask the user a yes/no question and return the answer}
  182. begin
  183.   Result := (MessageDlg(Question, mtConfirmation, [mbYes, mbNo], 0) = mrYes);
  184. end;
  185.  
  186. {$R *.DFM}
  187.  
  188. procedure TMainForm.FormCreate(Sender: TObject);
  189.  
  190. begin
  191.   {not initializing the modem}
  192.   Initializing := False;
  193.  
  194.   {set the font the terminal will use}
  195.   FontData := FontDialog.Font;
  196.  
  197.   {no zmodem auto start trigger}
  198.   AutoTrig := 0;
  199.  
  200.   {read configuration data from the INI file}
  201.   ReadConfiguration;
  202.  
  203.   {read information about the modem from TCOM.INI and put that into use}
  204.   ModemDatabase.FileName := DBFile;
  205.   ModemDatabase.Open     := True;
  206.   ModemDatabase.ReadFromIni(ModemInfo, tsModem, IniName);
  207.   Modem.ModemInfo := ModemInfo;
  208.  
  209.   {open the port}
  210.   OpenComPort;
  211.  
  212.   MainTerminal.Font           := FontData;
  213.   MainTerminal.DisplayRows    := 24;
  214.   MainTerminal.DisplayRows    := 25;
  215.   MainTerminal.DisplayColumns := 79;
  216.   MainTerminal.DisplayColumns := 80;
  217.  
  218.   (*Emulator.EmulatorType := Emulation; {!!.01}*)
  219.  
  220.   {size the terminal window to the font the user has chosen}
  221.   SizeToFont;
  222.  
  223.   {open the TCOM phonebook}
  224.   Phonebook.FileName := PhoneFile;
  225.   Phonebook.Open     := True;
  226.  
  227.   {put dialer options from INI file into effect}
  228.   SetDialerOptions;
  229.  
  230.   {clear status line}
  231.   StatusLine.Sections[3] := '';
  232.  
  233.   {if there are no modems in the database, don't let the user quick config}
  234.   if (ModemDatabase.NumModems = 0) then
  235.     ModemConfigItem.Enabled := False;
  236.  
  237.   {initilize upload stuff}
  238.   UploadList := TStringList.Create;
  239.   UploadIdx  := 0;
  240.  
  241.   {change protocol log behavior}                 {!!.01}
  242.   if SavePartials then                           {!!.01}
  243.     ProtocolLog.DeleteFailed := dfNever          {!!.01}
  244.   else                                           {!!.01}
  245.     ProtocolLog.DeleteFailed := dfAlways;        {!!.01}
  246.  
  247.   {initialize the modem}
  248.   if ComPort.DCD then begin                                              {!!.01}
  249.     if (MessageDlg('Carrier detected.  Send modem initialization?',      {!!.01}
  250.                    mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin {!!.01}
  251.       Initializing := True;                                              {!!.01}
  252.       Modem.Initialize;                                                  {!!.01}
  253.     end;                                                                 {!!.01}
  254.   end else begin                                                         {!!.01}
  255.     Initializing := True;
  256.     Modem.Initialize;
  257.   end;                                                                   {!!.01}
  258. end;
  259.  
  260. procedure TMainForm.UploadItemClick(Sender: TObject);
  261. var
  262.   Frm  : TProtocolSelectForm;
  263.   Prot : TProtocolType;
  264.  
  265. begin
  266.   {exit if in scrollback mode}
  267.   if MainTerminal.Scrollback then
  268.     Exit;
  269.  
  270.   {ask the user to select a protocol}
  271.   Prot := ptNoProtocol;
  272.   Frm  := TProtocolSelectForm.Create(Self);
  273.   if (Frm.ShowModal = mrOK) and (Frm.ProtocolList.ItemIndex <> -1) then
  274.     Prot := TProtocolType(Frm.ProtocolList.ItemIndex + 1);
  275.   Frm.Free;
  276.  
  277.   {upload file(s) using the selected protocol}
  278.   if (Prot <> ptNoProtocol) then
  279.     DoUpload(Prot);
  280. end;
  281.  
  282. procedure TMainForm.DownloadItemClick(Sender: TObject);
  283. var
  284.   Frm        : TProtocolSelectForm;
  285.   DownDirFrm : TDownloadDirectoryForm;
  286.   Prot       : TProtocolType;
  287.  
  288. begin
  289.   {exit if in scrollback mode}
  290.   if MainTerminal.Scrollback then
  291.     Exit;
  292.  
  293.   {ask the user to select a protocol}
  294.   Prot := ptNoProtocol;
  295.   Frm  := TProtocolSelectForm.Create(Self);
  296.   if (Frm.ShowModal = mrOK) and (Frm.ProtocolList.ItemIndex <> -1) then
  297.     Prot := TProtocolType(Frm.ProtocolList.ItemIndex + 1);
  298.   Frm.Free;
  299.  
  300.   {download file(s) using the selected protocol}
  301.   if (Prot <> ptNoProtocol) then begin
  302.     if Prot in BatchProtocols then begin
  303.       DownDirFrm := TDownloadDirectoryForm.Create(Self);
  304.       if (DownDirFrm.ShowModal <> mrOK) then begin
  305.         DownDirFrm.Free;
  306.         Exit;
  307.       end;
  308.  
  309.       Protocol.DestinationDirectory := DownDirFrm.DownloadDirEdit.Text;
  310.       DownDirFrm.Free;
  311.     end else begin
  312.       SaveDialog.Title    := 'Choose Download File Name';
  313.       SaveDialog.FileName := '*.*';
  314.       if SaveDialog.Execute then
  315.         Protocol.FileName := SaveDialog.FileName
  316.       else
  317.         Exit;
  318.     end;
  319.  
  320.     DoDownload(Prot);
  321.   end;
  322. end;
  323.  
  324. procedure TMainForm.CaptureItemClick(Sender: TObject);
  325. var
  326.   CMode : TCaptureMode;
  327.  
  328. begin
  329.   {exit if in scrollback mode}
  330.   if MainTerminal.Scrollback then
  331.     Exit;
  332.  
  333.   if (MainTerminal.Capture = cmOn) then begin
  334.     {turn off capturing}
  335.     MainTerminal.Capture := cmOff;
  336.     CaptureItem.Checked  := False;
  337.   end else begin
  338.     {select a capture file name}
  339.     SaveDialog.Title    := 'Capture File Name';
  340.     SaveDialog.FileName := '*.*';
  341.     if SaveDialog.Execute then begin
  342.       CMode := cmOn;
  343.  
  344.       {if the file exists, see if the user wants to append to the old file}
  345.       if FileExists(SaveDialog.FileName) then
  346.         case MessageDlg('Capture file exists.  Append?', mtConfirmation, mbYesNoCancel, 0) of
  347.           mrYes   : CMode := cmAppend;
  348.           mrCancel: Exit;
  349.         end;
  350.  
  351.       {turn on capturing}
  352.       MainTerminal.CaptureFile := SaveDialog.FileName;
  353.       MainTerminal.Capture     := CMode;
  354.       CaptureItem.Checked      := True;
  355.     end;
  356.   end;
  357. end;
  358.  
  359. procedure TMainForm.ExitItemClick(Sender: TObject);
  360. begin
  361.   Close;
  362. end;
  363.  
  364. procedure TMainForm.TerminalFontItemClick(Sender: TObject);
  365. begin
  366.   if FontDialog.Execute then begin
  367.     MainTerminal.Font := FontDialog.Font;
  368.     MainTerminal.DisplayRows    := 25;
  369.     MainTerminal.DisplayColumns := 80;
  370.     WriteTerminalOptions;
  371.     SizeToFont;
  372.   end;
  373. end;
  374.  
  375. procedure TMainForm.ParametersItemClick(Sender: TObject);
  376. var
  377.   Frm : TComParametersForm;
  378.  
  379. begin
  380.   Frm := TComParametersForm.Create(Self);
  381.   if (Frm.ShowModal = mrOK) then begin
  382.     WritePortOptions;
  383.     OpenComPort;
  384.   end;
  385.   Frm.Free;
  386. end;
  387.  
  388. procedure TMainForm.FlowControlItemClick(Sender: TObject);
  389. var
  390.   Frm : TFlowControlForm;
  391.  
  392. begin
  393.   Frm := TFlowControlForm.Create(Self);
  394.   if (Frm.ShowModal = mrOK) then begin
  395.     WriteFlowOptions;
  396.     OpenComPort;
  397.   end;
  398.   Frm.Free;
  399. end;
  400.  
  401. procedure TMainForm.DeviceItemClick(Sender: TObject);
  402. var
  403.   Frm : TDeviceSelectForm;
  404.  
  405. begin
  406.  Frm := TDeviceSelectForm.Create(Self);
  407.  if (Frm.ShowModal = mrOK) then begin
  408.    WriteDeviceOptions;
  409.    OpenComPort;
  410.  end;
  411.  Frm.Free;
  412. end;
  413.  
  414. (*{!!.01 - Added}
  415. procedure TMainForm.EmulationItemClick(Sender: TObject);
  416. var
  417.   Frm : TEmulatorForm;
  418.  
  419. begin
  420.   Frm := TEmulatorForm.Create(Self);
  421.   if (Frm.ShowModal = mrOK) then begin
  422.     WriteTerminalOptions;
  423.     Emulator.EmulatorType := Emulation;
  424.   end;
  425.   Frm.Free;
  426. end;*)
  427.  
  428. procedure TMainForm.DialerItemClick(Sender: TObject);
  429. var
  430.   Frm : TDialerParametersForm;
  431.  
  432. begin
  433.   Frm := TDialerParametersForm.Create(Self);
  434.   if (Frm.ShowModal = mrOK) then begin
  435.     WriteDialerOptions;
  436.     SetDialerOptions;
  437.   end;
  438.   Frm.Free;
  439. end;
  440.  
  441. procedure TMainForm.DirectoriesItemClick(Sender: TObject);
  442. var
  443.   Frm : TDirectorySettingsForm;
  444.  
  445. begin
  446.   Frm := TDirectorySettingsForm.Create(Self);
  447.   if (Frm.ShowModal = mrOK) then begin
  448.     WriteDataFileOptions;
  449.  
  450.     if not IsDirectory(DownloadDir) then
  451.       if YesNo('Download directory does not exist.  Create it?') then
  452.         try
  453.           MkDir(DownloadDir);
  454.         except
  455.           MessageDlg('Error creating directory!', mtError, [mbOK], 0);
  456.         end;
  457.  
  458.     if not IsDirectory(UploadDir) then
  459.       if YesNo('Upload directory does not exist. Create it?') then
  460.         try
  461.           MkDir(UploadDir);
  462.         except
  463.           MessageDlg('Error creating directory!', mtError, [mbOK], 0);
  464.         end;
  465.   end;
  466.   Frm.Free;
  467. end;
  468.  
  469. procedure TMainForm.ModemItemClick(Sender: TObject);
  470. var
  471.   Frm : TModemForm;
  472.  
  473. begin
  474.   Frm := TModemForm.Create(Self);
  475.   if (Frm.ShowModal = mrOK) then begin
  476.     ModemDatabase.WriteToIni(ModemInfo, tsModem, IniName);
  477.     Modem.ModemInfo := ModemInfo;
  478.   end;
  479.   Frm.Free;
  480. end;
  481.  
  482. procedure TMainForm.ModemConfigItemClick(Sender: TObject);
  483. var
  484.   Frm : TQuickModemForm;
  485.  
  486. begin
  487.   Frm := TQuickModemForm.Create(Self, ModemDatabase);
  488.   if (Frm.ShowModal = mrOK) then begin
  489.     ModemDatabase.WriteToIni(ModemInfo, tsModem, IniName);
  490.     Modem.ModemInfo := ModemInfo;
  491.  
  492.     {send configuration string to the modem}
  493.     if (ModemInfo.ConfigCmd <> '') then
  494.       if YesNo('Do you want to send configuration strings to the modem?') then
  495.         Modem.Configure;
  496.   end;
  497.   Frm.Free;
  498. end;
  499.  
  500. procedure TMainForm.GeneralItemClick(Sender: TObject);
  501. var
  502.   Frm : TGeneralProtocolOptionsForm;
  503.  
  504. begin
  505.   Frm := TGeneralProtocolOptionsForm.Create(Self);
  506.   if (Frm.ShowModal = mrOK) then
  507.     WriteProtocolOptions;
  508.   Frm.Free;
  509. end;
  510.  
  511. procedure TMainForm.ZmodemItemClick(Sender: TObject);
  512. var
  513.   Frm    : TZmodemOptionsForm;
  514.   AutoOn : Boolean;
  515.  
  516. begin
  517.   AutoOn := ZmodemAutoSt;
  518.  
  519.   Frm := TZmodemOptionsForm.Create(Self);
  520.   if (Frm.ShowModal = mrOK) then begin
  521.     WriteZmodemOptions;
  522.  
  523.     {if no change in zmodem options, exit}
  524.     if (AutoOn = ZmodemAutoSt) then
  525.       Exit;
  526.  
  527.     {did the user turn on auto start?}
  528.     if AutoOn and not ZmodemAutoSt then begin
  529.       {disable auto start trigger}
  530.       ComPort.RemoveTrigger(AutoTrig);
  531.       AutoTrig := 0;
  532.     end else
  533.       EnableZmodemAutoStart;
  534.   end;
  535.   Frm.Free;
  536. end;
  537.  
  538. procedure TMainForm.KermitItemClick(Sender: TObject);
  539. var
  540.   Frm : TKermitOptionsForm;
  541.  
  542. begin
  543.   Frm := TKermitOptionsForm.Create(Self);
  544.   if (Frm.ShowModal = mrOK) then
  545.     WriteKermitOptions;
  546.   Frm.Free;
  547. end;
  548.  
  549. procedure TMainForm.ASCIIItemClick(Sender: TObject);
  550. var
  551.   Frm : TAsciiOptionsForm;
  552.  
  553. begin
  554.   Frm := TAsciiOptionsForm.Create(Self);
  555.   if (Frm.ShowModal = mrOK) then
  556.     WriteAsciiOptions;
  557.   Frm.Free;
  558. end;
  559.  
  560. procedure TMainForm.BPlusItemClick(Sender: TObject);
  561. var
  562.   Frm  : TBPlusOptionsForm;
  563.   BPOn : Boolean;
  564.  
  565. begin
  566.   BPOn := BPlusEnabled;
  567.  
  568.   Frm := TBPlusOptionsForm.Create(Self);
  569.   if (Frm.ShowModal = mrOK) then begin
  570.     WriteBPlusOptions;
  571.  
  572.     {if not change in B+ options, exit}
  573.     if (BPOn = BPlusEnabled) then
  574.       Exit;
  575.  
  576.     {did the user turn B+ on?}
  577.     if (BPOn and not BplusEnabled) then
  578.       MainTerminal.BPlusTriggers := True
  579.     else
  580.       MainTerminal.BPlusTriggers := False;
  581.   end;
  582.  
  583.   Frm.Free;
  584. end;
  585.  
  586. procedure TMainForm.PhonebookItemClick(Sender: TObject);
  587. begin
  588.   PhonebookEditor.Execute;
  589. end;
  590.  
  591. procedure TMainForm.DialItemClick(Sender: TObject);
  592. begin
  593.   if PhoneNumberSelector.Execute then begin
  594.     DialerDialog.PhoneNumber := PhoneNumberSelector.SelectedNumber;
  595.     DialerDialog.Execute;
  596.   end;
  597. end;
  598.  
  599. procedure TMainForm.HangupItemClick(Sender: TObject);
  600. begin
  601.   Modem.Hangup;
  602. end;
  603.  
  604. procedure TMainForm.DialBtnClick(Sender: TObject);
  605. begin
  606.   DialItemClick(Sender);
  607. end;
  608.  
  609. procedure TMainForm.HangupBtnClick(Sender: TObject);
  610. begin
  611.   HangupItemClick(Sender);
  612. end;
  613.  
  614. procedure TMainForm.UploadBtnClick(Sender: TObject);
  615. begin
  616.   UploadItemClick(Sender);
  617. end;
  618.  
  619. procedure TMainForm.DownloadBtnClick(Sender: TObject);
  620. begin
  621.   DownloadItemClick(Sender);
  622. end;
  623.  
  624. procedure TMainForm.CaptureBtnClick(Sender: TObject);
  625. begin
  626.   CaptureitemClick(Sender);
  627. end;
  628.  
  629. procedure TMainForm.ParametersBtnClick(Sender: TObject);
  630. begin
  631.   ParametersItemClick(Sender);
  632. end;
  633.  
  634. procedure TMainForm.PhonebookBtnClick(Sender: TObject);
  635. begin
  636.   PhonebookEditor.Execute;
  637. end;
  638.  
  639. procedure TMainForm.FontBtnClick(Sender: TObject);
  640. begin
  641.   TerminalFontItemClick(Sender);
  642. end;
  643.  
  644. (*{!!.01 - Added}
  645. procedure TMainForm.EmulationBtnClick(Sender: TObject);
  646. begin
  647.   EmulationItemClick(Sender);
  648. end;*)
  649.  
  650. procedure TMainForm.ModemOk(Sender: TObject);
  651. begin
  652.   if Initializing then begin
  653.     StatusLine.Sections[3] := 'Modem initialized successfully!';
  654.     Initializing := False;
  655.   end;
  656. end;
  657.  
  658. procedure TMainForm.ModemError(Sender: TObject);
  659. begin
  660.   if Initializing then begin
  661.     StatusLine.Sections[3] := 'Modem error!';
  662.     Initializing := False;
  663.   end;
  664. end;
  665.  
  666. procedure TMainForm.ProtocolFinish(CP: TObject; ErrorCode: Integer);
  667. begin
  668.   RestoreLineSettings;
  669.  
  670.   {turn zmodem autostart back on}
  671.   EnableZmodemAutoStart;
  672.  
  673.   {turn B+ back on}
  674.   if BPlusEnabled then
  675.     MainTerminal.BPlusTriggers := True;
  676.  
  677.   MainTerminal.Active := True;
  678.   MainTerminal.SetFocus;
  679. end;
  680.  
  681. procedure TMainForm.MainTerminalKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  682. begin
  683.   if not MainTerminal.Scrollback and (StatusLine.Sections[3] <> '') then
  684.     StatusLine.Sections[3] := '';
  685.  
  686.   if not MainTerminal.Scrollback then
  687.     case Key of
  688.       VK_Left : ComPort.PutString(#27'[D');
  689.       VK_Right: ComPort.PutString(#27'[C');
  690.       VK_Up   : ComPort.PutString(#27'[A');
  691.       VK_Down : ComPort.PutString(#27'[B');
  692.     end;
  693. end;
  694.  
  695. procedure TMainForm.ScrollbackToggleItemClick(Sender: TObject);
  696. begin
  697.   MainTerminal.Scrollback := not MainTerminal.Scrollback;
  698.   if MainTerminal.Scrollback then
  699.     StatusLine.Sections[3] := 'In scrollback mode...press INS to exit'
  700.   else begin
  701.     StatusLine.Sections[3] := '';
  702.     MainTerminal.SetFocus;
  703.   end;
  704. end;
  705.  
  706. procedure TMainForm.ZmodemTrigger(CP: TObject; TriggerHandle: Word);
  707. begin
  708.   if (AutoTrig <> 0) and (TriggerHandle = AutoTrig) then begin
  709.     if IsDirectory(DownloadDir) then
  710.       Protocol.DestinationDirectory := DownloadDir
  711.     else
  712.       Protocol.DestinationDirectory := '';
  713.     DoDownload(ptZmodem);
  714.   end;
  715. end;
  716.  
  717. function LeftPadCh(S : string; const Ch : Char; const Len : Byte) : String;
  718.   {-Return a string left-padded to length len with ch}
  719. var
  720.   SLen : Byte absolute S;
  721.  
  722. begin
  723.   if (Length(S) >= Len) then
  724.     Result := S
  725.   else if (SLen < 255) then begin
  726.     Result[0] := Chr(Len);
  727.     MoveFast(S[1], Result[Succ(Word(Len))-SLen], SLen);
  728.     FillChar(Result[1], Len-SLen, Ch);
  729.   end;
  730. end;
  731.  
  732. procedure TMainForm.TerminalStatus(CP: TObject; Row, Col: Byte; BufRow, BufCol: Word);
  733. begin
  734.   StatusLine.Sections[1] := LeftPadCh(IntToStr(BufRow), '0', 3) + ' ' +
  735.                             LeftPadCh(IntToStr(BufCol), '0', 2);
  736.   StatusLine.Sections[2] := LeftPadCh(IntToStr(Row), '0', 2) +
  737.                             LeftPadCh(IntToStr(Col), '0', 2);
  738. end;
  739.  
  740. procedure TMainForm.BPlusStart(Sender: TObject);
  741. begin
  742.   MainTerminal.Active := False;
  743.   ChangeLineSettingsForProtocol;
  744. end;
  745.  
  746. procedure TMainForm.BPlusResume(CP: TObject; var Resume: TWriteFailAction);
  747. var
  748.   Frm : TBPlusResume;
  749.  
  750. begin
  751.   Frm := TBPlusResume.Create(Self);
  752.   Frm.ShowModal;
  753.   Resume := Frm.WriteFailAction;
  754.   Frm.Free;
  755. end;
  756.  
  757. {!!.01 - Added}
  758. procedure TMainForm.ProtocolNextFile(CP: TObject; var FName: OpenString);
  759. begin
  760.   if (UploadIdx <> UploadList.Count) then begin
  761.     FName := UploadList.Strings[UploadIdx];
  762.     Inc(UploadIdx);
  763.   end else
  764.     FName := '';
  765. end;
  766.  
  767. procedure TMainForm.OpenComPort;
  768.   {-Open the communications port}
  769. var
  770.   ComFrm : TComSelectForm;
  771.  
  772.   function ParityChar : Char;
  773.   begin
  774.     case Parity of
  775.       pNone : Result := 'N';
  776.       pOdd  : Result := 'O';
  777.       pEven : Result := 'E';
  778.       pMark : Result := 'M';
  779.       pSpace: Result := 'S';
  780.     end;
  781.   end;
  782.  
  783. begin
  784.   {stop port and modem}
  785.   if ComPort.Open then begin
  786.     MainTerminal.BPlusTriggers := False;
  787.     MainTerminal.Active     := False;
  788.     Modem.Started           := False;
  789.     StatusLights.Monitoring := False;
  790.     ComPort.Open            := False;
  791.     if (AutoTrig <> 0) then
  792.       ComPort.RemoveTrigger(AutoTrig);
  793.   end;
  794.  
  795.   {set port options}
  796.   ComPort.ComNumber := Ord(Com[4]) - Ord('1') + 1;
  797.   ComPort.Baud      := Baud;
  798.   ComPort.Parity    := Parity;
  799.   ComPort.Databits  := DataBits;
  800.   ComPort.Stopbits  := Stopbits;
  801.  
  802.   {set flow control options}
  803.   ComPort.HWFlowOptions := HdwFlow;
  804.   ComPort.SWFlowOptions := SfwFlow;
  805.   ComPort.XonChar       := XonChar;
  806.   ComPort.XoffChar      := XoffChar;
  807.  
  808.   {set device option}
  809.   ComPort.DeviceLayer := Device;
  810.  
  811.   {$IFDEF Tracing}
  812.   ComPort.TraceName := TraceFile;
  813.   ComPort.TraceSize := 20000;
  814.   ComPort.Tracing   := tlOn;
  815.   {$ENDIF}
  816.  
  817.   {$IFDEF DispatchLogging}
  818.   ComPort.LogName := DispLogFile;
  819.   ComPort.LogSize := 20000;
  820.   ComPort.Logging := tlOn;
  821.   {$ENDIF}
  822.  
  823.   while True do
  824.     try
  825.       ComPort.Open := True;
  826.       Break;
  827.     except
  828.       on EOpenComm do begin
  829.         ComFrm := TComSelectForm.Create(Self);
  830.         if (ComFrm.ShowModal = mrOK) then begin
  831.           Com               := ComFrm.SelectedCom;
  832.           ComPort.ComNumber := Ord(Com[4]) - Ord('1') + 1;
  833.           WritePortOptions;
  834.         end else
  835.           Halt;
  836.         ComFrm.Free;
  837.       end else
  838.         raise;
  839.     end;
  840.  
  841.   Modem.Started       := True;
  842.   MainTerminal.Active := True;
  843.  
  844.   {enable zmodem auto start, if user desires}
  845.   EnableZmodemAutoStart;
  846.  
  847.   {enable B+, if user desires}
  848.   if BplusEnabled then
  849.     MainTerminal.BPlusTriggers := True;
  850.  
  851.   {show status}
  852.   StatusLine.Sections[0]  := COM + ' ' + IntToStr(Baud) + ' ' +
  853.                              IntToStr(Databits) + ParityChar + IntToStr(Stopbits);
  854.   StatusLights.Monitoring := True;
  855. end;
  856.  
  857. procedure TMainForm.SetDialerOptions;
  858.   {-Set the dialer component properties based on configuration data}
  859. begin
  860.   DialerDialog.MaxDialTries  := MaxDialTries;
  861.   DialerDialog.RetrySecs     := RetryTime;
  862.   DialerDialog.DialerOptions := DialerOpts;
  863. end;
  864.  
  865. procedure TMainForm.SizeToFont;
  866.   {-Size the terminal to the current font size}
  867. var
  868.   R     : TRect;
  869.   TermW : Word;
  870.   TermH : Word;
  871.   X     : Integer;
  872.   Y     : Integer;
  873.  
  874. begin
  875.   {size the terminal window}
  876.   GetWindowRect(MainTerminal.Handle, R);
  877.   TermW := R.Right - R.Left;
  878.   TermH := R.Bottom - R.Top;
  879.   GetWindowRect(Handle, R);
  880.   ClientWidth  := TermW;
  881.   ClientHeight := Toolbar.Height + StatusLine.Height + LightPanel.Height + TermH;
  882.  
  883.   {re-center the window on the screen}
  884.   X := (Screen.Width - Width) div 2;
  885.   Y := (Screen.Height - Height) div 2;
  886.   if (X < 0) then X := 0;
  887.   if (Y < 0) then Y := 0;
  888.   SetBounds(X, Y, Width, Height);
  889. end;
  890.  
  891. procedure TMainForm.EnableZmodemAutoStart;
  892.   {-Add zmodem auto start trigger}
  893. begin
  894.   if ZmodemAutoSt then
  895.     AutoTrig := ComPort.AddDataTrigger(AutoStartSt, False);
  896. end;
  897.  
  898. procedure TMainForm.DoUpload(Prot : TProtocolType);
  899.   {-Upload file(s)}
  900. var
  901.   BatchULFrm : TBatchUploadForm;
  902.  
  903. begin
  904.   {if this is a batch protocol, select the files to upload}
  905.   if Prot in BatchProtocols then begin
  906.     UploadList.Clear;
  907.     BatchULFrm := TBatchUploadForm.Create(Self, UploadList);
  908.     if (BatchULFrm.ShowModal = mrOK) and (UploadList.Count <> 0) then
  909.       UploadIdx := 0
  910.     else
  911.       Exit;
  912.  
  913.   {otherwise, select a single file}
  914.   end else begin
  915.     UploadSelDialog.FileName := '*.*';
  916.     if not UploadSelDialog.Execute then
  917.       Exit;
  918.  
  919.   end;
  920.  
  921.   with Protocol do begin
  922.     ProtocolType := Prot;
  923.  
  924.     case Prot of
  925.       ptKermit:
  926.         begin
  927.           Protocol.KermitCtlPrefix := CtlPrefix;
  928.           KermitHighbitPrefix      := HibitPrefix;
  929.           KermitMaxLen             := MaxPacketLen;
  930.           KermitRepeatPrefix       := RepeatPrefix;
  931.           KermitTerminator         := Terminator;
  932.           case ErrCheck of
  933.             '1': BlockCheckMethod := bcmChecksum;
  934.             '2': BlockCheckMethod := bcmChecksum2;
  935.             '3': BlockCheckMethod := bcmCrcK;
  936.           end;
  937.           KermitPadCharacter := PadChar;
  938.           KermitPadCount     := PadCount;
  939.         end;
  940.  
  941.       ptAscii:
  942.         begin
  943.           AsciiCharDelay     := DelayChar;
  944.           AsciiLineDelay     := DelayLine;
  945.           AsciiEOLChar       := EolChar;
  946.           AsciiCRTranslation := UploadCR;
  947.           AsciiLFTranslation := UploadLF;
  948.           AsciiSuppressCtrlZ := StopCtrlZ;
  949.           AsciiEOFTimeout    := AscTimeout;
  950.         end;
  951.     end;
  952.   end;
  953.  
  954.   if not (Prot in BatchProtocols) then
  955.     Protocol.FileName := UploadSelDialog.FileName;
  956.  
  957.   {get rid of zmodem auto start trigger}
  958.   if ZmodemAutoSt then begin
  959.     ComPort.RemoveTrigger(AutoTrig);
  960.     AutoTrig := 0;
  961.   end;
  962.  
  963.   {get rid of B+ triggers}
  964.   MainTerminal.BPlusTriggers := False;
  965.  
  966.   MainTerminal.Active := False;
  967.   ChangeLineSettingsForProtocol;
  968.   Protocol.StartTransmit;
  969. end;
  970.  
  971. procedure TMainForm.DoDownload(Prot : TProtocolType);
  972.   {-Download file(s)}
  973. begin
  974.   with Protocol do begin
  975.     ProtocolType    := Prot;
  976.     WriteFailAction := WriteOpt;
  977.     RTSLowForWrite  := not RTSWrite;
  978.  
  979.     case Prot of
  980.       ptKermit:
  981.         begin
  982.           Protocol.KermitCtlPrefix := CtlPrefix;
  983.           KermitHighbitPrefix      := HibitPrefix;
  984.           KermitMaxLen             := MaxPacketLen;
  985.           KermitRepeatPrefix       := RepeatPrefix;
  986.           KermitTerminator         := Terminator;
  987.           case ErrCheck of
  988.             '1': BlockCheckMethod := bcmChecksum;
  989.             '2': BlockCheckMethod := bcmChecksum2;
  990.             '3': BlockCheckMethod := bcmCrcK;
  991.           end;
  992.           KermitPadCharacter := PadChar;
  993.           KermitPadCount     := PadCount;
  994.         end;
  995.  
  996.       ptAscii:
  997.         begin
  998.           AsciiCharDelay     := DelayChar;
  999.           AsciiLineDelay     := DelayLine;
  1000.           AsciiEOLChar       := EolChar;
  1001.           AsciiCRTranslation := DownloadCR;
  1002.           AsciiLFTranslation := DownloadLF;
  1003.           AsciiSuppressCtrlZ := StopCtrlZ;
  1004.           AsciiEOFTimeout    := AscTimeout;
  1005.         end;
  1006.     end;
  1007.   end;
  1008.  
  1009.   {get rid of zmodem auto start trigger}
  1010.   if ZmodemAutoSt then begin
  1011.     ComPort.RemoveTrigger(AutoTrig);
  1012.     AutoTrig := 0;
  1013.   end;
  1014.  
  1015.   {get rid of B+ triggers}
  1016.   MainTerminal.BPlusTriggers := False;
  1017.  
  1018.   MainTerminal.Active := False;
  1019.   ChangeLineSettingsForProtocol;
  1020.   Protocol.StartReceive;
  1021. end;
  1022.  
  1023. procedure TMainForm.ChangeLineSettingsForProtocol;
  1024.   {-Save the current line settings before protocol}
  1025. begin
  1026.   SavedParity      := ComPort.Parity;
  1027.   SavedDataBits    := ComPort.DataBits;
  1028.   SavedStopBits    := ComPort.StopBits;
  1029.  
  1030.   ComPort.Parity   := pNone;
  1031.   ComPort.DataBits := 8;
  1032.   ComPort.StopBits := 1;
  1033. end;
  1034.  
  1035. procedure TMainForm.RestoreLineSettings;
  1036.   {-Restore line settings to originals}
  1037. begin
  1038.   ComPort.Parity   := SavedParity;
  1039.   ComPort.DataBits := SavedDataBits;
  1040.   ComPort.StopBits := SavedStopBits;
  1041. end;
  1042.  
  1043.  
  1044. procedure TMainForm.SpeedButton1Click(Sender: TObject);
  1045. begin
  1046.   ComPort.Tracing := tlDump;
  1047. end;
  1048.  
  1049. end.
  1050.